// package com.example.apigateway.config;
//
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.data.redis.core.RedisTemplate;
// import org.springframework.security.authorization.AuthorizationDecision;
// import org.springframework.security.authorization.ReactiveAuthorizationManager;
// import org.springframework.security.core.Authentication;
// import org.springframework.security.web.server.authorization.AuthorizationContext;
// import org.springframework.stereotype.Component;
// import reactor.core.publisher.Mono;
//
// /**
//  * @author yang
//  * 自定义认证接口管理
//  * 在WebFluxSecurity中自定义鉴权操作需要实现ReactiveAuthorizationManager接口
//  */
// @Slf4j
// @Component
// public class ReactiveJdbcAuthenticationManager implements ReactiveAuthorizationManager<AuthorizationContext> {
//     @Autowired
//     private RedisTemplate<String,Object> redisTemplate;
//
//     //
//     // private TokenStore tokenStore;
//     //
//     // public  ReactiveJdbcAuthenticationManager(TokenStore tokenStore){
//     //     this.tokenStore = tokenStore;
//     // }
//
//     @Override
//     public Mono<AuthorizationDecision> check(Mono<Authentication> mono, AuthorizationContext authorizationContext) {
//
//         return mono.thenReturn(new AuthorizationDecision(true));
//         //先去掉网关路径匹配访问权限,在微服务用方法拦截
//         // //从Redis中获取当前路径可访问角色列表
//         // URI uri = authorizationContext.getExchange().getRequest().getURI();
//         // Object obj = redisTemplate.opsForHash().get(RedisConstant.RESOURCE_ROLES_MAP, uri.getPath());
//         // List<String> authorities = Convert.toList(String.class,obj);
//         // authorities = authorities.stream().map(i -> i = AuthConstant.AUTHORITY_PREFIX + i).collect(Collectors.toList());
//         // //认证通过且角色匹配的用户可访问当前路径
//         // return mono
//         //         .filter(Authentication::isAuthenticated)
//         //         .flatMapIterable(Authentication::getAuthorities)
//         //         .map(GrantedAuthority::getAuthority)
//         //         .any(authorities::contains)
//         //         .map(AuthorizationDecision::new)
//         //         .defaultIfEmpty(new AuthorizationDecision(false));
//     }
// }